package 数据结构和算法.剑指offer.位运算.二进制中的1的个数;

import 工具.打印.PrintUtil;

/**
 * 请实现一个函数，输入一个整数，输出该数二进制表示中 1 的个数。
 * 例如，把 9 表示成二进制是 1001，有 2 位是 1。因此，如果输入 9，则该函数输出 2。
 * <p>
 * 首先要熟悉二进制的位运算：
 * &是与操作，|是或操作，^是异或操作，<<是左移，>>是右移
 * >>:右移运算符，num >> 1,相当于num除以2;<<:左移运算符，num << 1,相当于num乘以2
 * <p>
 * 初始化返回值res
 * while循环下，当n不为0
 * n与1做逻辑与运算，即最后一位数与1做逻辑与运算，结果累加存入res
 * n右移一位
 * 直至n为0
 */
public class Test {
    public static void main(String[] args) {
        PrintUtil.println(countOne(4));
        PrintUtil.println(conutTwo(4));
    }

    // 统计二进制数中1的个数
    public static int countOne(int n) {
        return Integer.bitCount(n);
    }

    // 使用位运算符
    public static int conutTwo(int n) {
        int res = 0;
        while (n != 0) {
            res += n & 1;
            n >>= 1;
        }

        return res;
    }
}
